#ifndef MATRIX
#define MATRIX
#include <iostream>
#include <stdarg.h>
#include <cmath>
#include<stdio.h>


class Matrix
{
    public:
	  Matrix(int numRow_,int numCol_);
	  ~Matrix();
	  Matrix(const Matrix &MatrixToCopy);
	  void fill( ... );
	  Matrix operator+(const Matrix &m) const;
	  Matrix operator*(const Matrix &m) const;
	  double* operator[](int numRow) const;
	  Matrix operator=(const Matrix &m);
	  
	  int getNumCol() const;
	  int getNumRow() const;
	  
	  void print() const;
	friend std::ostream& operator<<(std::ostream& s, Matrix& m);
	  Matrix T() const;

	  static Matrix rotX(double delta);
	  static Matrix rotY(double delta);
	  static Matrix rotZ(double delta);
	  
	  static Matrix translation(double x,double y,double z);
	  static Matrix projection(double z);
	  
	  
	  //this Matrix compute the matrix doing the translation and rotations with respect to the camera point and camera nearest point on the plan . 
	  static Matrix compute_translation_and_rotations(double xPlan,double yPlan,double zPlan,double xCam,double yCam,double zCam);
	  
	  //the display matrix gives the transformation matrix that must be applied before 
	  static Matrix display(double xPlan,double yPlan,double zPlan,double xCam,double yCam,double zCam);
	  
	  static Matrix computeArcballRotation(double x,double y,double z);

	//static Matrix matrixRotateEuler(vector<double> v);
    private:
	  int numRow;
	  int numCol;
	  double** tab;
};

#endif
